package structural_pattern.proxy.jdk_proxy;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 获取代理对象的工厂类
 */


public class ProxyFactory {
    // 声明目标对象
    private TrainStation trainStation = new TrainStation();
    // 获取代理对象
    public SellTickets getProxy() {
        /*
            三个参数：
                ClassLoader loader：类加载器，用于加载代理类，可以通过目标对象获取类加载器
                Class<>[] interface：代理类实现的接口的字节码对象
                InvocationHandler h：代理对象的调用处理程序
         */
        SellTickets proxy = (SellTickets) Proxy.newProxyInstance(
                trainStation.getClass().getClassLoader(),
                trainStation.getClass().getInterfaces(),
                new InvocationHandler() {
                    /*
                        invoke方法：调用原始方法，扩展功能 ——> 实现代理方法
                        参数：
                            Object proxy：代理对象 ——> invoke方法中基本不用
                            Method method：对接口中的方法进行封装的对象
                            Object[] args：
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // 对目标对象的扩展
                        System.out.println("JDK动态代理");
                        // 执行目标对象的方法
                        Object object = method.invoke(trainStation, args);
                        return object;
                    }
                }
        );
        // 返回代理对象
        return proxy;
    }
}
